package com.ns.core.mapper;

import com.ns.core.vo.mp.CustomMap;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 公用Mapper，封装一些常见的Mapper操作，避免某些及其简单的逻辑也要写一堆xml方法
 *
 * @author lw
 * 更新于2024-12-01 新增部分方法
 */
@Mapper
public interface IMapper {

    /**
     * 指定表的指定字段增加指定值，可以为负值
     *
     * @param tableName  表名字
     * @param columnName 列值
     * @param num        增加的值
     * @param id         id值
     * @return CustomMap
     */
    int columnAdd(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("num") long num,
            @Param("id") Object id
    );

    /**
     * 指定表的指定字段增加指定值，可以为负值
     *
     * @param tableName  表名字
     * @param columnName 列名字
     * @param num        增加的值
     * @param ids        id列表
     * @return CustomMap
     */
    int columnAddByIds(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("num") long num,
            @Param("ids") List<?> ids
    );

    /**
     * 更新某个字段：指定表的指定字段更新为指定值,根据指定id
     *
     * @param tableName  表名子
     * @param columnName 列名
     * @param value      值
     * @param id         id值
     * @return CustomMap
     */
    int updateColumnById(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("value") Object value,
            @Param("id") Object id
    );

    /**
     * 批量更新某个字段：指定表的指定字段更新为指定值,根据指定id列表
     *
     * @param tableName  表名子
     * @param columnName 列名
     * @param value      值
     * @param ids        id值
     * @return CustomMap
     */
    int updateColumnByIds(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("value") Object value,
            @Param("ids") List<?> ids
    );

    /**
     * 指定表的指定字段更新为指定值, 根据指定列的指定值
     *
     * @param tableName   表名
     * @param columnName  列名
     * @param columnValue 列值
     * @param whereName   条件列名
     * @param whereValue  条件列值
     * @return CustomMap
     */
    int updateColumnBy(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("columnValue") Object columnValue,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

    // ------------------------ 查询SQL相关 ------------------------


    /**
     * 获取指定表的指定字段值,根据指定条件(whereName=whereValue)
     *
     * @param tableName  表名
     * @param columnName 列名
     * @param whereName  条件列名
     * @param whereValue 条件列值
     * @return CustomMap
     */
    String getColumnByWhere(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

    /**
     * 获取指定表的指定字段值列表,并转化为long, 根据指定条件(whereName=whereValue)
     *
     * @param tableName  表名
     * @param columnName 列名
     * @param whereName  条件列名
     * @param whereValue 条件列值
     * @return CustomMap
     */
    List<Long> getColumnListToLongByWhere(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

    /**
     * 获取指定表的count数据,根据指定条件(whereName=whereValue)
     *
     * @param tableName  表名
     * @param whereName  条件列名
     * @param whereValue 条件列值
     * @return CustomMap
     */
    long getCountBy(
            @Param("tableName") String tableName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

    // ------------------------ 查询集合SQL相关 ------------------------

    /**
     * 获取指定表的全部字段全部数据转化为Map
     *
     * @param tableName 表名子
     * @return CustomMap
     */
    List<CustomMap> getListMap(@Param("tableName") String tableName);

    /**
     * 获取指定表的全部字段全部数据转化为Map, 根据指定条件(whereName=whereValue)
     *
     * @param tableName  表名字
     * @param whereName  条件列名
     * @param whereValue 条件列值
     * @return CustomMap
     */
    List<CustomMap> getListMapByWhere(
            @Param("tableName") String tableName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

    /**
     * 获取指定表的全部字段全部数据转化为Map, 根据指定条件(id=id)
     *
     * @param tableName 表名子
     * @param id        id值
     * @return CustomMap
     */
    List<CustomMap> getListMapById(
            @Param("tableName") String tableName,
            @Param("id") Object id
    );

    /**
     * 更急sql查询
     *
     * @param sqlExp
     * @return Long
     */
    Long getCountBySql(@Param("sqlExp") String sqlExp);
}
